import { isObject } from '../utils'
import { reactive } from './reactive'
import { track, trigger } from './effect'

export function ref (value) {
  // 不用拦截所有的对象中的属性，只需要拦截value
  // 判断这个值是否是RefImpl实例
  if(value && value.__ref) {
    return value
  }

  class RefImpl {
    constructor (val) {
      // 将 判断value是引用类型 响应式
      this.__ref = true
      this._val = convert(val)
    }
    // 拦截value 属性
    get value () {
      track(this, 'value')
      return this._val
    }

    // 拦截set属性
    set value (val) {
      if(this._val !== val) {
        this._val = convert(val)
        trigger(this, 'value')
      }
      return this._val
    }
  }
  return new RefImpl(value)
}

function convert (val) {
  return isObject(val) ? reactive(val) : val
}
